package cn.lili.modules.auth.serviceimpl;

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.lili.cache.impl.RedisCache;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.enums.SceneEnums;
import cn.lili.common.security.token.Token;
import cn.lili.common.utils.ResultUtil;
import cn.lili.common.utils.SnowFlake;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.auth.service.QrCodeLoginService;
import cn.lili.modules.member.client.UserClient;
import cn.lili.modules.member.entity.dos.User;
import cn.lili.modules.model.ScanCodeModal;
import cn.lili.modules.token.TokenGenerate;
import com.alibaba.fastjson.JSON;
import com.api.UserApi;
import com.pojos.OpenAppUser;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
@Slf4j
public class QrCodeLoginServiceImpl implements QrCodeLoginService {

    @Autowired
    private TokenGenerate tokenGenerate;

    @Autowired
    private UserClient userClient;

    @Value("${fw.appid}")
    String appId;

    //    = "http://localhost:8900"
    @Value("${fw.server}")
    String fwServer;

//    private final Logger logger = LoggerFactory.getLogger(QrCodeLoginServiceImpl.class);


    @Autowired
    private UserApi userApi;

    /**
     * 登录
     *
     * @param sessionId 飞语临时Id
     * @param appId     应用程序Id
     * @param scene     应用场景
     * @return token
     */
//    public ResultMessage<Object> login(String sessionId, String appId, String scene) {
//        //是否绑定飞语
//        JSONObject isBindJson = this.userIsBind(sessionId, null, appId);
//        if (isBindJson.getInt("code") == 500) {
//            return ResultUtil.error(500, String.valueOf(isBindJson.get("msg")));
//        }
//        //已绑定，去登录
//        if (isBindJson.getInt("code") == 200) {
//            String userId = isBindJson.getStr("data");
//            User user = userClient.getById(userId);
//            boolean supplier = SceneEnums.SUPPLIER.name().equals(scene) && user != null;
//            if (supplier && CommonConstant.AUDIT_STATUS_00.equals(user.getAuditStatus())) {
//                return ResultUtil.error(500, "分销商未审核");
//            }
//            if (supplier && CommonConstant.AUDIT_STATUS_02.equals(user.getAuditStatus())) {
//                return ResultUtil.error(500, "分销商审核未通过");
//            }
//            Token token = tokenGenerate.generateToken(user, false);
//            return ResultUtil.data(token);
//        }
//        //未绑定，创建账号，去绑定。然后在登录。
//        if (isBindJson.getInt("code") == 201) {
//            return ResultUtil.error(500, "请绑定后在扫码登录", isBindJson.get("data"));
//        }
//        return ResultUtil.error(500, "未知状况");
//    }
//

    /**
     * 移动端登录，自动创建账号，并授权。
     *
     * @param sessionId 飞语临时Id
     * @return token
     */
    @Override
    public ResultMessage<Object> appLogin(String sessionId, String scene) {
        String updateUserInfoRedisKey = "update_user_info_redis:";
        OpenAppUser appUser = userApi.getUserinfo(sessionId);
        if (appUser == null) {
            return ResultUtil.error(500, "获取飞语用户信息失败");
        }
        if (StringUtils.isEmpty(appUser.getOpenId())) {
            return ResultUtil.error(500, "获取到的飞语用户，无openId");
        }
        User user = userClient.getByOpenId(appUser.getOpenId(), scene);
        log.info("#appLogin# 移动端授权登录,更新头像和昵称,查询user,结果为:{}", null != user ? com.alibaba.fastjson.JSONObject.toJSONString(user) : null);
        if (user != null && StringUtils.isNotEmpty(user.getId())) {
            //更新用户头像和昵称
//            user.setFace(appUser.getAvater());
//            user.setFyName(appUser.getNickName());
//            if (StringUtils.isNotEmpty(appUser.getAccount())) {
//                user.setAccount(appUser.getAccount());
//            }
//            boolean flag = userClient.updateUserFyNameAndFaceById(user);
//            log.info("#appLogin# 移动端授权登录,更新头像和昵称,{}", flag ? "成功" : "失败");


            Token token = tokenGenerate.generateToken(user, false);
            token.setIs_vip(appUser.getIs_vip());
            log.info("token---------", com.alibaba.fastjson.JSONObject.toJSONString(token));
            return ResultUtil.data(token);
        }
        //判断场景下是否存在此用户,存在则不进行创建
        User isUser = userClient.getByUserName(appUser.getAccount(), scene);
        if (isUser != null && isUser.getId() != null) {
            //更新用户头像和昵称
//            isUser.setFace(appUser.getAvater());
//            isUser.setFyName(appUser.getNickName());
//            boolean flag = userClient.updateUserFyNameAndFaceById(isUser);
//            log.info("#appLogin# 移动端授权登录,更新头像和昵称,{}", flag ? "成功" : "失败");
            return ResultUtil.error(500, "场景：" + appUser.getAccount() + ",已存在：" + scene);
        }

        //飞语用户，生成账号，并保存
        user = new User(appUser.getAccount(), null, null, SceneEnums.getScene(scene));
        user.setId(SnowFlake.getIdStr());
        user.setFace(appUser.getAvater());
        user.setOpenId(appUser.getOpenId());
        user.setAccount(appUser.getAccount());
        user.setFyName(appUser.getNickName());
        user = userClient.generateUser(user);
        Token token = tokenGenerate.generateToken(user, false);
        token.setIs_vip(appUser.getIs_vip());
        return ResultUtil.data(token);
    }

//    /**
//     * 生成用户  并  绑定用户
//     *
//     * @return token
//     */
//    public ResultMessage<Object> generateBindUser(Object fyData, String scene, String sessionId) {
//        FyUser fyUser = BeanUtil.toBean(fyData, FyUser.class);
//        //扫码人有手机号,且有已有注册,且与之前手动注册的手机号一致。
//        if (StringUtils.isNotBlank(fyUser.getMobile())) {
//            User mobileUser = userClient.getByMobile(fyUser.getMobile(), SceneEnums.getScene(scene));
//            if (mobileUser != null) {
//                ResultMessage<Object> resultMessage = this.bindUser(mobileUser.getId(), sessionId);
//                if (resultMessage.getCode() == 500) {
//                    return resultMessage;
//                }
//                Token token = tokenGenerate.generateToken(mobileUser, false);
//                return ResultUtil.data(token);
//            }
//        }
//        //生成账号，并保存
//        User user = new User(fyUser.getName(), new BCryptPasswordEncoder().encode(fyUser.getPassword()), fyUser.getMobile(), SceneEnums.getScene(scene));
//        user.setFace(fyUser.getPortrait());
//        user.setId(SnowFlake.getIdStr());
//        user = userClient.generateUser(user);
//        //绑定飞语
//        ResultMessage<Object> resultMessage = this.bindUser(user.getId(), sessionId);
//        if (resultMessage.getCode() == 500) {
//            return resultMessage;
//        }
//        Token token = tokenGenerate.generateToken(user, false);
//        return ResultUtil.data(token);
//    }
//
//    /**
//     * 绑定飞语
//     *
//     * @param userId    平台用户Id
//     * @param sessionId 飞语临时Id
//     * @return 是否绑定成功
//     */
//    public ResultMessage<Object> bindUser(String userId, String sessionId) {
//        HttpRequest fyUserBindHttp = HttpUtil.createGet(fwServer + "/fyUser/bind/" + userId + "?sessionId=" + sessionId + "&appId=" + appId);
//        JSONObject fyUserBindJson = new JSONObject(fyUserBindHttp.execute().body());
//        if (fyUserBindJson.getInt("code") == 500) {
//            return ResultUtil.error(500, String.valueOf(fyUserBindJson.get("msg")));
//        }
//        return ResultUtil.success();
//    }
//
//    /**
//     * 创建二维码
//     *
//     * @param pageUrl     访问页面
//     * @param callBackUrl 回调页面
//     * @param appId       应用程序Id
//     * @param scene       应用场景
//     * @param isBind
//     * @param userId
//     * @return 二维码图片
//     */
//    @SneakyThrows
//    @Override
//    public ResultMessage<Object> createQrCode(String pageUrl, String callBackUrl, String appId, String scene, Boolean isBind, String userId) {
//        //创建二维码
//        pageUrl = URLEncoder.encode(pageUrl, "UTF-8");
//        if (isBind == null) {
//            return ResultUtil.error(500, "isBind为空");
//        }
//        HttpRequest codeExpireHttp = HttpUtil.createGet(fwServer + "/createQrcode?callBackUrl="
//                + callBackUrl + "&appId=" + appId + "&scene=" + scene + "&pageUrl=" + pageUrl + "&isBind=" + isBind + "&userId=" + userId);
//
//        JSONObject codeExpireJson = new JSONObject(codeExpireHttp.execute().body());
//        if (codeExpireJson.getInt("code") != 200) {
//            return ResultUtil.error(codeExpireJson.getInt("code"), String.valueOf(codeExpireJson.get("msg")));
//        }
//        return ResultUtil.data(codeExpireJson.get("data"));
//    }
//

    /**
     * 创建二维码
     *
     * @param scene  应用场景
     * @param userId 扫码绑定时的用户
     * @return 二维码图片
     */
    @SneakyThrows
    @Override
    public ResultMessage<Object> createQrCode(String scene, String userId) {
        HttpRequest codeExpireHttp = HttpUtil.createGet(fwServer + "/createQrcode?appId=" + appId + "&scene=" + scene + "&userId=" + userId);

        JSONObject codeExpireJson = new JSONObject(codeExpireHttp.execute().body());
        if (codeExpireJson.getInt("code") != 200) {
            return ResultUtil.error(codeExpireJson.getInt("code"), String.valueOf(codeExpireJson.get("msg")));
        }
        return ResultUtil.data(codeExpireJson.get("data"));
    }

    public ResultMessage<Object> checkCode(String code) {
        // 1.调用scan_code服务的checkCode接口获取用户信息
        JSONObject codeJson;
        try {
            log.info("开始请求===");
            HttpRequest codeHttp = HttpUtil.createGet(fwServer + "/checkCode?code=" + code);
//            String body = codeHttp.execute().body();
//            log.info("checkCode --- ： {}", body);
            codeJson = new JSONObject(codeHttp.execute().body());
            log.info("checkCode --- 扫码登录验证结果： {}", codeJson);
        }catch(Exception e) {
            e.printStackTrace();
            throw new ServiceException("服务器异常");
        }
        // 2.根据获取到的用户信息的openid确认商户是否有绑定此openId的
        if (codeJson.getInt("code") != 200) {
            return ResultUtil.error(codeJson.getInt("code"), codeJson.getStr("msg"));
        }
        JSONObject entries = (JSONObject) codeJson.get("data");
        ScanCodeModal scanCodeModal = com.alibaba.fastjson.JSONObject.toJavaObject(JSON.parseObject(entries.toString()), ScanCodeModal.class);

        if (scanCodeModal == null) {
            return ResultUtil.error(500, "未获取到扫码信息");
        }
        log.info("scanCodeModal = {}" , scanCodeModal.toString());
        log.info("scanCodeModal.getUserId() = {}" , scanCodeModal.getUserId());

        // 4.如果没有，则将此openid绑定到当前用户token对应的商户
        if (StringUtils.isNotEmpty(scanCodeModal.getUserId())) {
            OpenAppUser openAppUser = scanCodeModal.getOpenAppUser();
            log.info("openAppUser = {}" , openAppUser);
            String scene = scanCodeModal.getScene();
            User user = userClient.getByOpenId(openAppUser.getOpenId(), scene);
            if (user != null && StringUtils.isNotEmpty(user.getId())) {
                return ResultUtil.error(500,"该飞语在此场景下已存在账号，不允许进行绑定");
            }
            userClient.updateFyById(openAppUser.getOpenId(), openAppUser.getAccount(), openAppUser.getNickName(), scanCodeModal.getUserId(), scene);
            return ResultUtil.data("绑定成功");
        }
        // 3.如果有，则是登录逻辑，返回用户token
        if (scanCodeModal.getOpenAppUser() != null && scanCodeModal.getOpenAppUser().getOpenId() != null && scanCodeModal.getScene() != null) {
            OpenAppUser openAppUser = scanCodeModal.getOpenAppUser();
            String openId = openAppUser.getOpenId();
            String scene = scanCodeModal.getScene();
            User user = userClient.getByOpenId(openId, scene);
            if (user == null || StringUtils.isEmpty(user.getId())) {
                return ResultUtil.error(500, "未绑定飞语");
            }
            return ResultUtil.data(tokenGenerate.generateToken(user, false));
        }
        // 5.如果用户是未登录状态，则直接返回报错，提示此飞语账号未绑定商城用户
        return ResultUtil.error(500, "未登录且未绑定飞语");
    }

}